#ifndef DSPSIMULATOR_IRGENERATOR_H
#define DSPSIMULATOR_IRGENERATOR_H

#include "simulator/llvmJit/llvmJit.h"

class DSPSimulator;

class IRGenerator {
private:
    friend class DSPSimulator;

    llvm::LLVMContext *m_llvmContext = nullptr;   // llvm上下文
    llvm::Module *m_llvmModule = nullptr; // llvm模块
    std::shared_ptr<llvm::IRBuilder<>> m_irBuilder; // llvm ir生成器
public:
    IRGenerator() = default;

    ~IRGenerator() = default;

    /**
     * 根据llvm jit执行引擎对象初始化ir生成器
     * @param llvmJit llvm jit执行引擎
     */
    void init(std::shared_ptr<LLVMJit> llvmJit);

    /**
     * 获取当前llvm模块的全局变量
     * @param name 全局变量名
     * @return 获取的全局变量
     */
    llvm::Value *getGlobalValue(const std::string &name);

    /**
     * 创建一个全局变量到当前llvm模块中
     * @param name 全局变量名
     * @param type 全局变量类型
     * @return 创建的全局变量的指针
     */
    llvm::Value *createGlobalValue(const std::string &name, llvm::Type *type);

    /**
     * 在当前llvm模块中创建一个外部链接类型的函数
     * @param functionType 函数的类型（参数，返回值）
     * @param funcName 函数名
     * @return 创建的函数的指针
     */
    llvm::Function *createFunctionWithExternalLinkage(llvm::FunctionType *functionType, const std::string &funcName);

    /**
     * 获取llvm上下文
     * @return llvm上下文
     */
    llvm::LLVMContext *getLLVMContext();

    /**
     * 获取当前生成器中的llvm模块
     * @return llvm模块
     */
    llvm::Module *getLLVMModule();

    /**
     * 获取llvm IR生成器
     * @return llvm IR生成器
     */
    std::shared_ptr<llvm::IRBuilder<>> getLLVMIRBuilder();
};

#endif //DSPSIMULATOR_IRGENERATOR_H
